const name = 'a.js';
let count = 1;

exports.name = name;

const exportModule = {
  _name: `__name__${name}`,
  count,
};

module.exports = exportModule;

setTimeout(() => {
  console.log('a.js >>> ', exportModule.count);
}, 3000);

console.log('a.js run');
console.log(exports === module.exports);

/*
  当使用commonJS模块化规范时

  一个文件中，如果既使用 exports.xxx 的形式导出模块
  又使用了 module.exports 的方式导出模块

  其底层处理是：
    1.当存在module.exports时，它的优先级最高，即使同时使用了exports.xxx 的形式导出模块也会被忽略
      当使用require导出模块后，拿到的模块值对应的就是module.exports对应的值

    2.使用exports.xxx导出变量时，其底层最终是把exports这个对象赋值给module.exports 然后导出
      也就是说，即使没有使用module.exports进行变量的导出，在require导入模块获取值时，取的值
      也是从导入文件中的module.exports出取的（它的值来源于exports对象）

    3. exports === module.exports >>> true

    4.通过module.exports导出的变量与通过require()执行得到的变量是同一个引用
      这意味着，在b模块中引入了a模块，然后修改其在b模块中得到的模块变量值，a模块也会对应着被更改

    5.最终导出使用的是 module.exports 所以，推荐模块导出时使用 module.exports的方式导出变量
*/

/*
  exports = () => {};

  当exports的引用被改变，module.exports 与 exports 之间将无关联

  最终 通过 require 获取到的变量是一个 {}

  exports !== module.exports // true

  所以：exports = { xxx } 这种方式不能用
*/

/*
  源码里是这样的：

  module.exports = {}

  exports = module.exports

  require 方法执行 返回的是 module.exports
*/
